/**
 * Smtp.java
 */

package cliente;

import java.net.*;
import java.io.*;

/**
 * Smtp SMTP por linha de comandos que permite enviar un {@link Correo}
 * 
 * @author Juan Jose Ferreiro Ferreiro
 */
public class Smtp extends Protocolo {

    /**
     * Crea un Cliente SMTP que se conecta a {@code maquina}:{@code porto}
     * 
     * @param maquina Host do servidor SMTP
     * @param porto Onde escoita o servidor
     */
    public Smtp(String maquina, int porto) {
        this.servidor = maquina;
        this.porto = porto;
    }

    /**
     * Implementa o comando HELO de SMTP
     * 
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    private void helo() throws IOException, Exception {
    	out.println("HELO");
        comprobaResposta(in.readLine(), "250");
    }

    /**
     * Implementa o comando MAIL de SMTP 
     * 
     * @param remitente Quen envia o Correo
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    private void mailfrom(String remitente) throws IOException, Exception {
        out.println("MAIL From:<" + remitente.trim() + ">");
        comprobaResposta(in.readLine(), "250");
    }

    /**
     * Implementa o camando RCPT de SMTP
     * 
     * @param destinatario A quen(es) vai dirixido
     * @param numDest Numero de destinatarios
     * @param cc A quen(es) se lles envia unha copia
     * @param numCc Numero de enderezos aos que se lles envia a copia
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    private void rcptto(String[] destinatario, int numDest, String[] cc, int numCc) throws IOException, Exception {
        for (int i = 0; i < numDest; i++) {
            out.println("RCPT To:<" + destinatario[i].trim() + ">");
            comprobaResposta(in.readLine(), "250");
        }

        for (int i = 0; i < numCc; i++) {
            out.println("RCPT To:<" + cc[i].trim() + ">");
            comprobaResposta(in.readLine(), "250");
        }
    }

    /**
     * Implementa o comando DATA de SMTP
     * 
     * @param texto Corpo da mensaxe
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    private void data(String texto) throws IOException, Exception {
        out.println("DATA");
        comprobaResposta(in.readLine(), "354");
        out.println(texto);
        out.println(".");
        comprobaResposta(in.readLine(), "250");
    }

    /**
     * Envia un {@link Correo} usando o protocolo SMTP
     * 
     * @param correo Correo a enviar
     * @throws java.net.UnknownHostException
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    public void enviar(Correo correo) throws UnknownHostException, IOException, Exception {
        abrir();
        comprobaResposta(in.readLine(), "220");
        helo();
        mailfrom(correo.getRemitente());
        rcptto(correo.getDestinatario(), correo.numeroDestinatarios(), correo.getCc(), correo.numeroDeCc());
        data(correo.toString());
        quit();
        cerrar();
    }
}
